﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SistemaGO_Library.Persistencia.BD;

namespace SistemaGO_Library.Entidades.Usuario
{
    class RepositorioUsuario : IRepositorioUsuario
    {
        private BD bd = new BD();

        //Descrição: Método que é usado nas regras de negócio do sistema identificando se um usuário que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: login = atributo identificador do usuário que vai dizer se existe ou não.
        public bool existeUsuario(string login) {
            string sql = "SELECT usu_login FROM tb_usuario WHERE usu_login = '" + login + "' ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["usu_login"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de um usuário no banco de dados.
        //Valores: usu = usuário passado para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public void inserirUsuario(Usuario usu) {
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_usuario (usu_login, usu_senha, usu_nome, usu_sobrenome, usu_data_nasc, usu_prioridade, usu_av_rua, usu_num, usu_complemento, usu_uf, usu_cidade, usu_bairro, usu_cep) ");
            sql.Append("VALUES ('" + usu.Usu_login + "', '" + usu.Usu_senha + "', '" + usu.Usu_nome + "', '" + usu.Usu_sobrenome + "', '" + usu.Usu_data_nasc.ToString("MM/dd/yyyy") + "', '" + usu.Usu_prioridade + "', '" + usu.Usu_av_rua + "', " + usu.Usu_num + ", '" + usu.Usu_complemento + "', '" + usu.Usu_uf + "', '" + usu.Usu_cidade + "', '" + usu.Usu_bairro + "', '" + usu.Usu_cep + "')");
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza busca de um usuario no banco de dados.
        //Valores: login = login passado para que seja realizada a busca.
        public Usuario buscarUsuario(string login) {
            Usuario usu = new Usuario();
            string sql = "SELECT * FROM tb_usuario WHERE usu_login = '" + login + "' ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    usu.Usu_login = dr["usu_login"].ToString();
                    usu.Usu_senha = dr["usu_senha"].ToString();
                    usu.Usu_nome = dr["usu_nome"].ToString();
                    usu.Usu_sobrenome = dr["usu_sobrenome"].ToString();
                    usu.Usu_data_nasc = DateTime.Parse(dr["usu_data_nasc"].ToString());
                    usu.Usu_prioridade = dr["usu_prioridade"].ToString();
                    usu.Usu_av_rua = dr["usu_av_rua"].ToString();
                    usu.Usu_num = int.Parse(dr["usu_num"].ToString());
                    usu.Usu_complemento = dr["usu_complemento"].ToString();
                    usu.Usu_uf = dr["usu_uf"].ToString();
                    usu.Usu_cidade = dr["usu_cidade"].ToString();
                    usu.Usu_bairro = dr["usu_bairro"].ToString();
                    usu.Usu_cep = dr["usu_cep"].ToString();
                }
                return usu;
            }
        }

        //Descrição: Método que realiza alteração de um usuario no banco de dados.
        //Valores: login = login passado para que seja realizada a busca de qual usuario ele irá alterar, novoUsuario = novo usuario que será inserido no lugar do antigo.
        public void alterarUsuario(string login, Usuario novoUsuario) {
            string sql;
            sql = "UPDATE tb_usuario SET usu_senha = '" + novoUsuario.Usu_senha + "', usu_nome = '" + novoUsuario.Usu_nome + "', usu_sobrenome = '" + novoUsuario.Usu_sobrenome + "', usu_data_nasc = '" + novoUsuario.Usu_data_nasc.ToString("MM/dd/yyyy") + "', usu_prioridade = '" + novoUsuario.Usu_prioridade + "', usu_av_rua = '" + novoUsuario.Usu_av_rua + "', usu_num = " + novoUsuario.Usu_num + ", usu_complemento = '" + novoUsuario.Usu_complemento + "', usu_uf = '" + novoUsuario.Usu_uf + "', usu_cidade = '" + novoUsuario.Usu_cidade + "', usu_bairro = '" + novoUsuario.Usu_bairro + "', usu_cep = '" + novoUsuario.Usu_cep + "' WHERE usu_login = '" + login + "' ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de um usuario no banco de dados.
        //Valores: login = login passado para que seja realizada a busca no banco para exclusão.
        public void excluirUsuario(string login) {
            string sql;
            sql = "DELETE FROM tb_usuario WHERE usu_login = '" + login + "' ";
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza o login do usuário no sistema. Ele retorna um usuário para que fique registrado todas as operações feitas pelo mesmo.
        //Valores Passados: login = login do usuário, senha = senha do usuário.
        public Usuario logarUsuario(string login, string senha) {
            Usuario usuario = new Usuario();
            string sql = "SELECT * FROM tb_usuario WHERE usu_login = '" + login + "' and usu_senha = '" + senha + "'";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    usuario.Usu_login = dr["usu_login"].ToString();
                    usuario.Usu_senha = dr["usu_senha"].ToString();
                    usuario.Usu_nome = dr["usu_nome"].ToString();
                    usuario.Usu_sobrenome = dr["usu_sobrenome"].ToString();
                    usuario.Usu_data_nasc = DateTime.Parse(dr["usu_data_nasc"].ToString());
                    usuario.Usu_prioridade = dr["usu_prioridade"].ToString();
                    usuario.Usu_av_rua = dr["usu_av_rua"].ToString();
                    usuario.Usu_num = int.Parse(dr["usu_num"].ToString());
                    usuario.Usu_complemento = dr["usu_complemento"].ToString();
                    usuario.Usu_uf = dr["usu_uf"].ToString();
                    usuario.Usu_cidade = dr["usu_cidade"].ToString();
                    usuario.Usu_bairro = dr["usu_bairro"].ToString();
                    usuario.Usu_cep = dr["usu_cep"].ToString();
                    //Tratamento para não puxar os fiscais
                    if(usuario.Usu_prioridade == "A" || usuario.Usu_prioridade == "O") {
                        contador = contador + 1;
                    }
                }

                if (contador == 1) {
                    return usuario;
                } else {
                    return null;
                }
            }
        }

        //Descrição: Método que ao logar o usuário, será registrada a sua entrada (logon) no sistema.
        //Valores: O usuário para poder o obter o login do mesmo e a data e a hora do 'logon'.
        //Retoro: Retorna o código da posição de registro de logon.
        public int registrarLogonUsuario(Usuario usu, DateTime data)
        {
            string sql = "INSERT INTO tb_acessos (usu_login, data_hora_login) VALUES ('" + usu.Usu_login + "', '" + data.ToString("MM/dd/yyyy hh:mm:ss") + "')";
            bd.rodarComando(sql);
            string sql2 = "SELECT MAX (acesso_cod) FROM tb_acessos";
            int i = bd.buscarCodigo(sql2);
            return i;
        }

        //Descrição: Método que ao deslogar o usuário, será registrada a sua saída (logoff) do sistema.
        //Valores: A data do logoff do usuario e o código da posição do registro de logon.
        public void registrarLogoffUsuario(DateTime data, int cod)
        {
            string sql = "UPDATE tb_acessos set data_hora_logout = '" + data.ToString("MM/dd/yyyy hh:mm:ss") + "' WHERE acesso_cod = '" + cod + "'";
            bd.rodarComando(sql);
        }
    }
}
